<?php
/**
 * Модуль статических страниц
 *
 */
class PluginContentwedding_ModuleNews extends Module
{
    /**
     * @var PluginContentwedding_ModuleNews_MapperNews $oMapper
     */
    protected $oMapper;
    protected $aRebuildIds = array();

    /**
     * Инициализация
     *
     */
    public function Init()
    {
        $this->oMapper = Engine::GetMapper(__CLASS__);
    }

    /**
     * Добавляет страницу
     *
     * @param NewsEntity_News $oPage
     *
     * @return unknown
     */
    public function AddPage(PluginContentwedding_ModuleNews_EntityNews $oPage)
    {
        if ($sId = $this->oMapper->AddPage($oPage)) {
            $oPage->setId($sId);
            //чистим зависимые кеши
            $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,
                array('news_change', "news_change_{$oPage->getId()}", "news_change_urlfull_{$oPage->getUrlFull()}"));
            return true;
        }
        return false;
    }

    /**
     * Обновляет страницу
     *
     * @param NewsEntity_News $oPage
     *
     * @return unknown
     */
    public function UpdatePage(PluginContentwedding_ModuleNews_EntityNews $oPage)
    {
        if ($this->oMapper->UpdatePage($oPage)) {
            //чистим зависимые кеши
            $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,
                array('news_change', "news_change_{$oPage->getId()}", "news_change_urlfull_{$oPage->getUrlFull()}"));
            return true;
        }
        return false;
    }

    /**
     * Получает страницу по полному УРЛу
     *
     * @param unknown_type $sUrlFull
     */
    public function GetPageByUrlFull($sUrlFull, $iActive = 1)
    {
        if (false === ($data = $this->Cache_Get("news_{$sUrlFull}_{$iActive}"))) {
            $data = $this->oMapper->GetPageByUrlFull($sUrlFull, $iActive);
            if ($data) {
                $this->Cache_Set($data, "news_{$sUrlFull}_{$iActive}", array("news_change_{$data->getId()}"),
                    60 * 60 * 24 * 5);
            } else {
                $this->Cache_Set($data, "news_{$sUrlFull}_{$iActive}", array("news_change_urlfull_{$sUrlFull}"),
                    60 * 60 * 24 * 5);
            }
        }
        return $data;
    }

    /**
     * Получает страницу по её айдишнику
     *
     * @param unknown_type $sId
     *
     * @return unknown
     */
    public function GetPageById($sId)
    {
        return $this->oMapper->GetPageById($sId);
    }

    /**
     * Получает список всех страниц ввиде дерева
     *
     * @return unknown
     */
    public function GetPages($aFilter = array())
    {
        $aPages = array();
        $aPagesRow = $this->oMapper->GetPages($aFilter);
        if (count($aPagesRow)) {
            $aPages = $this->BuildPagesRecursive($aPagesRow);
        }
        return $aPages;
    }

    /**
     * Строит дерево страниц
     *
     * @param unknown_type $aPages
     * @param unknown_type $bBegin
     *
     * @return unknown
     */
    protected function BuildPagesRecursive($aPages, $bBegin = true)
    {
        static $aResultPages;
        static $iLevel;
        if ($bBegin) {
            $aResultPages = array();
            $iLevel = 0;
        }
        foreach ($aPages as $aPage) {
            $aTemp = $aPage;
            $aTemp['level'] = $iLevel;
            unset($aTemp['childNodes']);
            $aResultPages[] = Engine::GetEntity('PluginContentwedding_News', $aTemp);
            if (isset($aPage['childNodes']) and count($aPage['childNodes']) > 0) {
                $iLevel++;
                $this->BuildPagesRecursive($aPage['childNodes'], false);
            }
        }
        $iLevel--;

        return $aResultPages;
    }

    /**
     * Рекурсивно обновляет полный URL у всех дочерних страниц(веток)
     *
     * @param unknown_type $oPageStart
     */
    public function RebuildUrlFull($oPageStart)
    {
        $aPages = $this->GetPagesByPid($oPageStart->getId());
        foreach ($aPages as $oPage) {
            if ($oPage->getId() == $oPageStart->getId()) {
                continue;
            }
            if (in_array($oPage->getId(), $this->aRebuildIds)) {
                continue;
            }
            $this->aRebuildIds[] = $oPage->getId();
            $oPage->setUrlFull($oPageStart->getUrlFull() . '/' . $oPage->getUrl());
            $this->UpdatePage($oPage);
            $this->RebuildUrlFull($oPage);
        }
    }

    /**
     * Получает список дочерних страниц первого уровня
     *
     * @param unknown_type $sPid
     *
     * @return unknown
     */
    public function GetPagesByPid($sPid)
    {
        return $this->oMapper->GetPagesByPid($sPid);
    }

    /**
     * Удаляет страницу по её айдишнику
     * Если тип таблиц БД InnoDB, то удалятся и все дочернии страницы
     *
     * @param unknown_type $sId
     *
     * @return unknown
     */
    public function deletePageById($sId)
    {
        if ($this->oMapper->deletePageById($sId)) {
            //чистим зависимые кеши
            $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('news_change', "news_change_{$sId}"));
            return true;
        }
        return false;
    }

    /**
     * Получает число статических страниц
     *
     * @return unknown
     */
    public function GetCountPage()
    {
        return $this->oMapper->GetCountPage();
    }

    /**
     * Устанавливает ВСЕМ страницам PID = NULL
     * Это бывает нужно, когда особо "умный" админ зациклит страницы сами на себя..
     *
     * @return unknown
     */
    public function SetPagesPidToNull()
    {
        return $this->oMapper->SetPagesPidToNull();
    }

    /**
     * Получает слудующую по сортировке страницу
     *
     * @param unknown_type $iSort
     * @param unknown_type $sWay
     *
     * @return unknown
     */
    public function GetNextPageBySort($iSort, $sPid, $sWay = 'up')
    {
        return $this->oMapper->GetNextPageBySort($iSort, $sPid, $sWay);
    }

    /**
     * Получает значение максимальной сртировки
     *
     * @return unknown
     */
    public function GetMaxSortByPid($sPid)
    {
        return $this->oMapper->GetMaxSortByPid($sPid);
    }

    /**
     * Get count of pages
     *
     * @return integer
     */
    public function getCountOfActivePages()
    {
        return (int) $this->oMapper->getCountOfActivePages();
    }

    /**
     * Get list of active pages
     *
     * @param integer $iCount
     * @param integer $iCurrPage
     * @param integer $iPerPage
     *
     * @return array
     */
    public function getListOfActivePages(&$iCount, $iCurrPage, $iPerPage)
    {
        return $this->oMapper->getListOfActivePages($iCount, $iCurrPage,
            Config::Get('plugin.sitemap.objects_per_page'));
    }

}

?>